package com.mmall.concurrence.singleton;

import com.mmall.concurrence.annoations.NotRecommend;
import com.mmall.concurrence.annoations.NotThreadSafe;
import com.mmall.concurrence.annoations.ThreadSafe;

/**
 * 懒汉模式 --> 双重同步锁单例模式
 *
 *  double check + lock
 *
 * @author yuelinbo
 * @date 2018/12/18 9:57
 **/
@NotThreadSafe
@NotRecommend
public class SingletonExample3 {

    //私有构造函数
    private SingletonExample3(){

    }

    //静态私有单例对象
    private static SingletonExample3 instance = null;

    //静态的工厂方法
    public static SingletonExample3 getInstance(){
        if(instance == null){
            synchronized (SingletonExample3.class){
                if(instance == null){
                    instance = new SingletonExample3();
                }
            }

        }

        return instance;
    }
}

/*
* 多线程线程不安全
* 1、memory = allocate（） 分配对象内存空间
* 2、ctorInstance（）初始化对象
* 3、instance = memory 设置instance指向刚分配的内存
*
* JVM 和cpu优化 ，发生了指令重排
* * 1、memory = allocate（） 分配对象内存空间
*   2、instance = memory 设置instance指向刚分配的内存
 *  3、ctorInstance（）初始化对象
 *
*
* */
